home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / stk110 / stk.doc < prev    next >
Text File  |  1991-02-25  |  13KB  |  310 lines

  1. **********************************************************************
  2.                     This file is part of
  3.  
  4.          STK -- The sprite toolkit -- version 1.1
  5.  
  6.               Copyright (C) Jari Karjala 1991
  7.  
  8. The sprite toolkit (STK) is a FreeWare toolkit for creating high
  9. resolution sprite graphics with PCompatible hardware. This toolkit 
  10. is provided as is without any warranty or such thing. See the file
  11. COPYING and the end of this file for further information.
  12.  
  13. **********************************************************************
  14.  
  15.  
  16. STK -- The Sprite ToolKit -- version 1.1, Jan 14, 1991 
  17.  
  18.  
  19.  
  20. Intro
  21. =====
  22.  
  23. The Sprite Toolkit (STK) contains the following sets of functions,
  24. (each function has its set name in front of it):
  25.  
  26. SPR             lowlevel interface to the sprite functions
  27. SPR_HIT         lowlevel collision detection routines
  28. SPR_FIO         lowlevel sprite file IO
  29. SPR_ANIM        higher level interface to the sprite functions
  30. GR              text IO in the graphics mode and keyboard functions
  31. MOUSE           INT 33 interface to the mouse functions.
  32.  
  33. Note that there are two different interface levels to the sprite
  34. routines. 
  35.  
  36. The lowlevel functions provide support for simple sprites which
  37. can be put into the screen, hidden from the screen or deleted.
  38. Collisions between them can be detected. The sprite data can
  39. be read from a file, too.
  40.  
  41. The higher level interface supports animated sprites which are
  42. composed of simple sprites. These animated sprites can move
  43. automatically along some preset direction vector and act on
  44. different special cases, such as hitting the boundary or other
  45. sprite.
  46.  
  47. The GR functions provide a familiar set of basic text IO
  48. functions, like putch, put and printf, but these functions work
  49. in the graphics mode. There are also GR functions for direct
  50. reading of the keymap. These functions detect multiple
  51. simultaneus keypresses, as required by most arcade style games.
  52.  
  53. The MOUSE functions provide a very simple interface to the mouse
  54. driver. They are not much more that names to the INT 33 functions.
  55.  
  56.  
  57.  
  58.  
  59. Using the lowlevel sprite functions
  60. ===================================
  61.  
  62.  
  63. Initializing
  64. ------------
  65.  
  66. The first thing to do in a program which uses the STK is to
  67. start the graphics mode and initialize the sprites. This is done
  68. by the functions gr_detect, gr_start and spr_initialize (for
  69. further information, see The STK Function Reference (file
  70. STKREF.DOC)). Now we are ready to use the STK functions.
  71.  
  72.  
  73. Creating and destroying sprites
  74. -------------------------------
  75.  
  76. The sprites are represented by SPRITE handles. The exact definition
  77. of the object pointed by a handle is private to the STK
  78. implementation, therefore the sprites can be manipulated only
  79. with the provided functions.
  80.  
  81. Each sprite has a shape defined by a sprite map. These can be
  82. created by the SPRED sprite editor. Each sprite map contains the
  83. actual shape of the sprite and the mask which describe the
  84. transparent parts of the sprite.
  85.  
  86. We must create sprites before we can do anything with them. This
  87. is done with the function spr_create, if we have the sprite
  88. shape bitmaps in static arrays, or with the function
  89. spr_fio_read_smp if the shape is in a sprite map file. Both of
  90. these functions return a SPRITE handle. You can make copies of
  91. sprites by the spr_copy function (you should spr_share the
  92. sprite first to save memory, since copies of shared sprites
  93. share the shape data which can take quite much memory).
  94.  
  95. The sprite resolution parameter in the spr_create means the
  96. number of shifted images per 8 pixels, ie 4 means that the X
  97. coordinates 0 and 1 will map into the same screen position.  Try
  98. giving a numeric parameter (1,2,4,8) to the StarMines program to
  99. see the effect of resolution parameter (for example "sm 4").
  100.  
  101. Each sprite should be though of as an object with its own
  102. identity and properties like the current location, the shape
  103. data and the identifier. If you need many sprites with the same
  104. shape, you should use the spr_copy to make copies, NOT to try to
  105. display the same sprite many times at different locations.
  106.  
  107. When the sprite is no longer needed it should be destroyed with
  108. the spr_delete function, which releases all the resources used
  109. by the sprite.
  110.  
  111.  
  112. How much memory do we need
  113. --------------------------
  114.  
  115. A sprite which is W bytes wide and H scanlines tall and uses
  116. sprite resolution S takes 2*S*((W+1)*H) + 2*(W+1)*H bytes of
  117. memory from far heap and only about 40 bytes from the near heap.
  118. This means that the small memory model is big enough in most
  119. applications. 
  120.  
  121. Example: the sprite is 32 pixels (4 bytes) wide, 24 pixels tall
  122. and we want the best resolution (8). The sprite will need
  123. 2*8*((4+1)*24) + 2*(4+1)*24 = 2160 bytes memory. 
  124.  
  125. The memory consumption is one of the reasons why my sprites are
  126. monochrome, they would need 4 times as much memory (in the
  127. example over 8 kbytes for one sprite!) if they had 16 colors.
  128. Also the output would be four times slower making it impossible
  129. to use one pixel resolution in movements with anything slower
  130. than 16 MHz.
  131.  
  132. If sharing is used then the N copies will take 2*S*((W+1)*H) +
  133. 2*(W+1)*H*N bytes of memory from the far heap plus those 40
  134. bytes of near heap for each copy.
  135.  
  136.  
  137. Manipulating sprites
  138. --------------------
  139.  
  140. A sprite can be put into the screen with the function spr_put.
  141. A sprite which has been put into the screen can be hidden by the
  142. function spr_hide.  Displaying and hiding sprites do not take
  143. place immediately, but only after the next call to the function
  144. spr_next_pass. This function should be called in the main loop
  145. of the program after all sprites have been spr_put into their
  146. current positions.
  147.  
  148. What the spr_next_pass really does? It draws all the sprites
  149. which have been spr_put after the previous spr_next_pass into
  150. the hidden display page (and saves the background below them).
  151. Then that display page is activated and the sprites which are in
  152. the now-hidden page are deleted by restoring the previously
  153. saved background data. Therefore you must spr_put the sprites
  154. during every pass of the main loop of the program.
  155.  
  156. The method described above makes it possible to achieve
  157. reasonably fast flicker-free animation. There is a problem with
  158. this approach: EGA graphics cards are slow changing video pages,
  159. and therefore we must waste about 10 milliseconds waiting after
  160. the screen flip. Hercules cards do not need this wait-state,
  161. therefore Hercules mode is preferred in slower machines. Note
  162. that this wait-state affects the frame speed, and it should be
  163. regulated with the spr_regulate_speed function.
  164.  
  165. The collision detection should be done after all the sprites
  166. have been spr_put but before the spr_next_pass. It is possible
  167. to either check the collision between a sprite and a coordinate
  168. position, the collision between two sprites (spr_hit) or find
  169. all the sprites a given sprite collides (spr_hit_first and
  170. spr_hit_next). All collisions are first checked by the bounding
  171. box and after that by using the mask bitmap of the sprite.
  172.  
  173. You can retrieve information about a given sprite by the
  174. functions spr_get_id, spr_get_x, spr_get_y, spr_get_width and
  175. spr_get_height.
  176.  
  177. All SPR functions check their SPRITE arguments and if they are
  178. invalid they call the predefined function spr_err, which
  179. terminates the program with an error message. This is very
  180. useful, for example because using a deleted SPRITE can easily
  181. crash the system. You can redefine the function spr_err to do
  182. something else, but I do not recommend that.
  183.  
  184.  
  185. Using the higher level sprite functions
  186. =======================================
  187.  
  188.  
  189. Creating and destroying animated sprites
  190. ----------------------------------------
  191.  
  192. The animated sprites are represented by ANIM_SPRITE handles. The
  193. exact definition of the object pointed by a handle is private to
  194. the STK implementation, therefore the sprites can be manipulated
  195. only with the provided functions.
  196.  
  197. The ANIM_SPRITEs are created by the function spr_anim_create.
  198. This function takes simple sprites as parameters. These should
  199. have been generated earlier, for example by the function
  200. spr_create. Note that you must have different instances of
  201. simple sprites for each animated sprite you create. 
  202.  
  203. An animated sprite is deleted by the function spr_anim_delete.
  204. This function will not delete the simple sprites it contains. If
  205. also the simple sprites need to be deleted the function
  206. spr_anim_destroy must be used.
  207.  
  208.  
  209. Manipulating animated sprites
  210. -----------------------------
  211.  
  212. After the animated sprites have been created their locations,
  213. direction vectors, area limits and animation speeds should be
  214. set (functions spr_anim_set_*). After that they must be started
  215. to get them active (spr_anim_start). 
  216.  
  217. A program that uses animated sprites must call the function
  218. spr_anim_next_pass instead of the spr_next_pass function. This
  219. function will spr_put all the animated sprites, handle the
  220. special effects (see below), call the spr_next_pass and then
  221. update the positions and advance the animation of the animated
  222. sprites for the next pass.
  223.  
  224. The special effects (fx) can be used to change the behavior of
  225. the animated sprites in the following special situations:
  226.  
  227. - timeout,
  228. - hit X limit of the bounding box,
  229. - hit Y limit of the bounding box,
  230. - hit another sprite (simple or animated).
  231.         
  232. The fx handler function can be set for each animated sprite
  233. (function spr_anim_set_fx_handler) and this handler is called
  234. whenever such special situation occurs.  This handler can then
  235. adjust the sprite properties (location, direction etc), and then
  236. return a code which defines further actions. The actions are: 
  237.  
  238. - do nothing, 
  239. - spr_put again (location changed), 
  240. - stop animation (same as spr_anim_stop), 
  241. - delete the sprite (same as spr_anim_delete), 
  242. - destroy the sprite (same as spr_anim_destroy).
  243.  
  244. The default fx_handler will delete the animated sprite in
  245. collisions and timeouts, and bounce it off the limits. See the
  246. StarMines source for further examples of fx_handlers.
  247.  
  248. You can retrieve information about a given animated sprite by
  249. the function spr_anim_get_info which returns a pointer into a
  250. static structure describing the animated sprite. These values
  251. may be changed, but it does not affect the animated sprite.
  252.  
  253.  
  254.  
  255.  
  256. Compiling and linking with the STK
  257. ==================================
  258.  
  259. You need only the files STK.H (include file for function
  260. prototypes and type definitions) and STKS.LIB (small model
  261. library). The include file should be included into every module
  262. which uses the STK functions and the library must be included
  263. into the linking.  The examples below assume that these files
  264. are in the current working directory and the Turbo C is
  265. configured to use small memory model (default).
  266.  
  267. You should have received the SPRTEST.C example source code with
  268. the STK distribution archieve. (Also the file SPRTEST.SMP is
  269. needed for the sprite data.)  To compile and link the example,
  270. use the following command line:
  271.  
  272.         tcc sprtest.c stks.lib graphics.lib
  273.         
  274. Now you should have a working example program SPRTEST.EXE which
  275. will bounce two alien lifeforms around the screen. If they
  276. collide, the first one will be destroyed. After 5000 steps both
  277. the aliens are destroyed. Press Esc to exit the program.
  278.  
  279. If you prefer the integrated environment, you should include the
  280. file STKS.LIB in the project file. You might like to use the
  281. supplied file SPRTEST.PRJ to compile and link the test program
  282. in the integrated environment. If you get "multiply defined
  283. symbol" errors from the linker, you have probably the graphics
  284. library option enabled in the options/linker menu. Either
  285. disable that option or edit the project file.
  286.  
  287.  
  288.  
  289. **********************************************************************
  290.  
  291.  
  292.  
  293. If you have any comments, suggestions, extensions, bug reports
  294. (and fixes), let me know. I would also like to hear about the
  295. programs you create with the aid of the Sprite Toolkit. In fact,
  296. the main reason for writing the Sprite Toolkit was to increase
  297. the number of good Public Domain and ShareWare games for PC
  298. compatibles. I hope this toolkit will give you the initial
  299. thrust you needed to implement that game you have been dreaming
  300. about!
  301.  
  302.  
  303. Jari Karjala
  304. Veropellontie 11
  305. 00780 Helsinki
  306. Finland
  307.  
  308. FUNET: jka@niksula.hut.fi
  309.  
  310.